﻿#pragma once

#include "Transform.h"
#include "MeshData.h"
#include "Misc.h"
#include "SysBase.h"

namespace Base {

	class PixelShader;
	class VertexShader;
	class GameObject {
	public:
		GameObject();
		virtual ~GameObject() {}
		void Update() {
			// TODO:
		}
		void Draw();
		void DrawInstance(const std::vector<std::shared_ptr<Transform>>& transformVec);

		// 设置 shader
		void SetShader(VertexShader* vsShader, PixelShader* psShader);

		// 设置顶点
		void SetMesh_Pos(const MeshData& meshData);
		void SetMesh_PosNormal(const MeshData& meshData);
		void SetMesh_PosColor(const MeshData& meshData);
		void SetMesh_PosTex(const MeshData& meshData);
		void SetMesh_PosNormalTex(const MeshData& meshData);
		void SetMesh_PosNormalColorTex(const MeshData& meshData);

		// drawInstance
		void SetInstanceMesh_Pos(const MeshData& meshData);

	private:

		void ResetBuffer();

	private:

		// 每个顶点属性一个buffer
		// dx resources
		ComPtr<ID3D11Buffer> m_posBuffer;
		ComPtr<ID3D11Buffer> m_normalBuffer;
		ComPtr<ID3D11Buffer> m_colorBuffer;
		ComPtr<ID3D11Buffer> m_texBuffer;
		ComPtr<ID3D11Buffer> m_tangentBuffer;
		ComPtr<ID3D11Buffer> m_indexBuffer;

		ComPtr<ID3D11Buffer> mInstanceBuffer;

		ComPtr<ID3D11InputLayout> m_dxInputLayout;
		VertexShader* m_vsShader;
		PixelShader* m_psShader;
		MeshDataInput m_meshDataInput;

	public:

		Transform& GetTransform() {
			return m_transform;
		}

	private:
		Transform m_transform;
		int m_id;


		// 实例化的个数
		int mInstanceCount = 0;

		static int s_Id;
	};
}
